七天學會 swift - 解析 XML Day6


解析 XML

IOS SDK 本身已經內建 XML 解析器 NSXMLParser 了,除非要解析的 XML 檔案太複雜,否則使用內建的解析器就可以完成許多工作。
首先,在這個範例中,我們先建立一個簡單的 XML 檔案,檔名為 test.xml,並將他加到專案中。檔案內容如下:

<student begin_year="2016" end_year="2020">
    <id>A01</id>
    <name>Eric</name>
    <tel>1234567</tel>
</student>

透過解析器的解析,我們能得到 2016、A01、Eric、1234567 這些內容

  • 步驟說明

    1. 建立 Single View App 專案 :
    2. 新增一個檔案,檔名取為 test.xml。產生後輸入下列內容

      <student begin_year="2016" end_year="2020">
           <id>A01</id>
           <name>Eric</name>
           <tel>1234567</tel>
      </student>
      
    3. 開啟 ViewController.swift,這個類別需要符合 XMLParserDelegate 協定的規範。並且宣告一個變數,目的是之後用來存放解析到的標籤名稱。

      Class ViewController: UIViewController, XMLParserDelegate {
          var tagName: String? = nil
      
    4. 在 ViewDidLoad() 中開啟 test.xml 檔並且啟動 Parser

      override func viewDidLoad() {
          super.viewDidLoad()
          let url = Bundle.main.url(forResource: "test", withExtension: "xml")
          if let xml = XMLParser(contentsOf: url!) {
              xml.delegate = self
              xml.parse()
          } 
      }
      
    5. 實作 parser(_:didStartElement:namespeceURI:qualifedName:attributes:),這個函數可以抓到 XML 標籤中的開始標籤。

      func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
          tagName = nil
      
          switch elementName {
          case "student" :
              /* 印出
              begin_year: 2016
              end_year: 2020
              */
      
              for key in attributeDict.keys {
                  let value = attributeDict[key]
                  print("\(key): \(value!)")
              }
      
          default:
              tagName = elementName
          }
      }
      
    6. 實作 parser(_:foundCharacters:) 函數,這個函數用來取得開始標籤與結束標籤間的內容

      func parser(_ parser: XMLParser, foundCharacters string: String) {
      guard tagName != nil else {
              return
          }
      
          /* 印出
          id: A01
          name: Eric
          tel: 1234567
          */
      
          print("\(tagName!): \(string)")
      }
      
    7. 實作 parser(_:didEndElement:namespaceURI:qualifiedName:)函數,這個函數用來取得結束標籤。

      func parser(_ parser: XMLParser, didEndElement elementName : String, namespaceURI: String?, qualifiedName qName: String?) {
          tagName = nil
      }
      
    8. 執行結果
      begin_year: 2016
      end_year: 2020
      id: A01
      name: Eric
      tel: 1234567

#swift #iOS







你可能感興趣的文章

Limiting content with specified number of lines

Limiting content with specified number of lines

How to Install LAMP on Ubuntu 20.04

How to Install LAMP on Ubuntu 20.04

修改 Sublime Tab 預設為空兩格

修改 Sublime Tab 預設為空兩格






留言討論